package com.zlx.store.common.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 注意这里的引包，由于springboot集成的关系，所以引的包是amqp的包不可以直接生成rabbitmq的connection以及converter
 */
@Configuration
@Slf4j
public class RabbitMQConfig {
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 创建一个RabbitTemplate对象，用于与RabbitMQ进行消息交互。
     *
     * @param factory RabbitMQ连接工厂
     * @return RabbitTemplate对象
     */
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory) {

        // 创建RabbitTemplate对象，并传入连接工厂
        RabbitTemplate rabbitTemplate = new RabbitTemplate(factory);

        // 设置消息转换器
        rabbitTemplate.setMessageConverter((messageConverter()));

        // 设置mandatory属性为true，表示如果消息无法路由到队列时需要返回给生产者
        rabbitTemplate.setMandatory(true);

        // 设置ConfirmCallback，用于确认消息是否成功发送到交换机
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                // 在这里可以处理消息发送结果的逻辑
            }
        });

        // 返回创建的RabbitTemplate对象
        return rabbitTemplate;
    }

}
